/*
 * StorageResourceFactory.h
 *
 *  Created on: 03/10/2009
 *      Author: nik0l4z
 */

#ifndef STORAGERESOURCEFACTORY_H_
#define STORAGERESOURCEFACTORY_H_
#include "Model/StorageResource.h"


/**
 * Esta clase es la que se encarga, segun el metodo que se invoque, a instanciar las distintas estrategias de almacenamiento e indexado,
 * devolviendo un recurso listo para usarce. Notese que una vez devuelto el recurso. se le debera setear datos a
 * almacenar (storageResource->setData(dato)).
 * Los datos esperados por el recurso deben extender de la clase Dato.
 * Una vez instanciado el recurso y luego de haberle seteado el dato al mismo, el recurso esta listo para usarce.
 * Vease tambien la documentacion de StorageResource
 * @see StorageResource.h
 */
class StorageResourceFactory {

	public: virtual ~StorageResourceFactory();

	private: StorageResource *storageResource;

	public: StorageResourceFactory();

	public: void setStorageResource(StorageResource *storageResource);

	public: virtual StorageResource* getStorageResource() const;

	public: virtual void setCompressMode();


	/**
	 * No es posible indexar los un recurso con almacenamiento de texto con un Indice Hash
	 * Por default, siempre se asume una estrategia de indice con B#
	 **/
	void createStorageResource();
	void createStorageResourceInBuffer();
    void createStorageResourceInFile(string *path,Clave clave);
    void createStorageTextResource(string nombreArchivo);
    void createStorageTextResourceInBuffer(string nombreArchivo, unsigned short tamanioNodo);
    void createStorageTextResourceInFile(string *path,Clave clave);
    void createStorageTextResourceSingleWriting(string nombreArchivo, unsigned short tamanioNodo);
    void createStorageTextResourceDeferredWriting(string nombreArchivo, unsigned short tamanioNodo);
    void createStorageTextResourceInBufferIndexedByBsharp(string nombreArchivo, unsigned short tamanioNodo);
    void createStorageTextResourceInFileIndexedByBsharp(string *path,Clave clave, string nombreArchivo, unsigned short tamanioNodo);
    void createStorageTextResourceInBufferSingleWriting(string nombreArchivo, unsigned short tamanioNodo);
    void createStorageTextResourceInBufferDeferredWriting( string nombreArchivo, unsigned short tamanioNodo);
    void createStorageTextResourceInFileSingleWriting(string *path,Clave clave, string nombreArchivo, unsigned short tamanioNodo);
    void createStorageTextResourceInFileDeferredWriting(string *path,Clave clave, string nombreArchivo, unsigned short tamanioNodo);

    /**
     *  Este metodo crea un Recurso con la siguientes caracteristicas:
     *  Estrategia de Almacenamiento: Bloques
     *  Y por default se definen las siguientes caracteristicas
     *  Estrategia Indice: Hash
     *  Estrategia Recurso: Simple - Archivo Binario
     *
     */
    void createStorageBlockResource(int tamaniobloque, const string& nombreArchivo);

    /**
     *  Este metodo crea un Recurso con la siguientes caracteristicas:
     *  Estrategia de Almacenamiento: Bloques
     *  Y por default se definen las siguientes caracteristicas
     *  Estrategia Indice: Hash
     *  Estrategia Recurso: Directa  - Archivo y Buffer
     *
     */
    void createStorageBlockResourceInBuffer(int tamaniobloque, const string& nombreArchivo);

    /**
     *  Este metodo crea un Recurso con la siguientes caracteristicas:
     *  Estrategia de Almacenamiento: Bloques
     *  Y por default se definen las siguientes caracteristicas
     *  Estrategia Indice: Hash
     *  Estrategia Recurso: Simple - Archivo Binario
     *
     */
    void createStorageBlockResourceInFile(int tamaniobloque, const string& nombreArchivo);



    void createStorageBlockResourceIndexedByBsharp();
    void createStorageBlockResourceInBufferIndexedByBsharp();

    /**
     *  Este metodo crea un Recurso con la siguientes caracteristicas:
     *  Estrategia de Almacenamiento: Bloques
     *  Estrategia Indice: Hash
     *  Y por default se definen las siguientes caracteristicas
     *  Estrategia Recurso: Directa  - Archivo y Buffer
     *
     */
    void createStorageBlockResourceInBufferIndexedByExtensibleHash(int tamaniobloque, const string& nombreArchivo);
    void createStorageBlockResourceInFileIndexedByBsharp();



    /**
     *  Este metodo crea un Recurso con la siguientes caracteristicas:
     *  Estrategia de Almacenamiento: Bloques
     *  Estrategia Indice: Hash
     *  Estrategia Recurso: Simple - Archivo Binario
     *
     */
     void createStorageBlockResourceInFileIndexedByExtensibleHash(int tamaniobloque, const string& nombreArchivo);

    /**
     *  Este metodo crea un Recurso con la siguientes caracteristicas:
     *  Estrategia de Almacenamiento: Bloques
     *  Estrategia Indice: Hash
     *  Estrategia Recurso: Simple - Archivo Binario
     *
     */
    void createStorageBlockResourceIndexedByExtensibleHashSingleWriting(int tamaniobloque, const string& nombreArchivo);

    /**
     *  Este metodo crea un Recurso con la siguientes caracteristicas:
     *  Estrategia de Almacenamiento: Bloques
     *  Estrategia Indice: Hash
     *  Estrategia Recurso: Diferida  - Archivo Binario / Buffer
     *
     */

    void createStorageBlockResourceIndexedByExtensibleHashDeferredWriting(int tamaniobloque, const string& nombreArchivo);

    /**
     *  Este metodo crea un Recurso con la siguientes caracteristicas:
     *  Estrategia de Almacenamiento: Bloques
     *  Estrategia Indice: Hash
     *  Estrategia Recurso: Simple  - Archivo Binario
     *
     */
    void createStorageBlockResourceInFileIndexedByExtensibleHashSingleWriting(int tamaniobloque, const string& nombreArchivo);
    void createStorageRecordResource(int tamanioRegistro, string nombreArchivo);
    void createStorageRecordResourceInBuffer();
    void createStorageRecordResourceInFile();
    void createStorageRecordResourceInBufferIndexedByBsharp();

};

#endif /* STORAGERESOURCEFACTORY_H_ */
